﻿using Parylene_CVD.Commands;
using Parylene_CVD.DAL;
using Parylene_CVD.Model.DModels;
using Parylene_CVD.Service;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using System.Windows;
using Parylene_CVD.Tools;
using System.IO;

namespace Parylene_CVD.ViewModel
{
    public class AddDeviceViewModel : ViewModelBase
    {
        public AddDeviceViewModel(NavigationService DeviceManagementViewNavigationService)
        {
            BackCommand = new NavigateCommand(DeviceManagementViewNavigationService);
            SaveCommand = new RelayCommand(Save);
        }
        public ICommand BackCommand { get; }
        public ICommand SaveCommand { get; }
        private void Save(object parameter)
        {
            // 清空错误信息
            StringBuilder errors = new StringBuilder();

            // 必填项校验
            if (string.IsNullOrWhiteSpace(DeviceName))
            {
                errors.AppendLine("设备名不能为空。");
            }

            if (string.IsNullOrWhiteSpace(IP))
            {
                errors.AppendLine("IP地址不能为空。");
            }
            else
            {
                // IP地址格式校验
                if (!CheckIPAdress.IsValidIPAddress(IP))
                {
                    errors.AppendLine("IP地址格式无效，请输入正确的IPv4地址（例如：192.168.1.1）。");
                }
            }

            if (string.IsNullOrWhiteSpace(Port))
            {
                errors.AppendLine("端口号不能为空。");
            }
            else
            {
                // 端口号格式校验
                if (!int.TryParse(Port, out int portNumber) || portNumber < 1 || portNumber > 65535)
                {
                    errors.AppendLine("端口号无效，请输入介于 1 到 65535 之间的数字。");
                }
            }

            // 如果有错误，抛出异常或显示提示
            if (errors.Length > 0)
            {
                // 显示消息框（需要引用 System.Windows）
                MessageBox.Show(errors.ToString(), "输入错误", MessageBoxButton.OK, MessageBoxImage.Warning);

                // 直接返回，阻止保存
                return;
            }

            // 如果所有校验通过，调用保存方法
            try
            {
                // 数据保存的逻辑交给数据库实现
                SaveToDatabase();
                // 在数据保存目录下创建新设备的文件夹
                MakeNewDeviceDir();
                // 提示成功（可选）
                MessageBox.Show("添加成功！", "成功", MessageBoxButton.OK, MessageBoxImage.Information);
            }
            catch (Exception ex)
            {
                // 检查异常消息是否包含 UNIQUE KEY
                if (ex.Message.Contains("UNIQUE KEY", StringComparison.OrdinalIgnoreCase))
                {
                    MessageBox.Show("添加失败：设备名不能重复", "错误", MessageBoxButton.OK, MessageBoxImage.Warning);
                }
                else
                {
                    MessageBox.Show($"添加失败：请联系技术人员。\n错误信息：{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
                }
            }
        }

        public void MakeNewDeviceDir()
        {
            ParameterDAL parameterDAL = new ParameterDAL();
            string BasePath = parameterDAL.GetParameter("ParameterName = '数据保存目录'", "")[0].ParameterValue;
            // 拼接新文件夹路径
            string newFolderPath = Path.Combine(BasePath, DeviceName);

            // 检查并创建文件夹
            if (!Directory.Exists(newFolderPath))
            {
                Directory.CreateDirectory(newFolderPath);
            }
        }




        private void SaveToDatabase()
        {
            Device device = new Device(DeviceName, IP, Port, DateTime.Now, DateTime.Now);
            DeviceDAL deviceDAL = new DeviceDAL();
            deviceDAL.Add(device, "", 0);
        }


        // 设备名
        private string _devicename;
        public string DeviceName
        {
            get => _devicename;
            set
            {
                _devicename = value;
                OnPropertyChanged(nameof(DeviceName));
            }
        }

        // IP地址
        private string _iP;
        public string IP
        {
            get => _iP;
            set
            {
                _iP = value;
                OnPropertyChanged(nameof(IP));
            }
        }
        // 端口号
        private string _port;
        public string Port
        {
            get => _port;
            set
            {
                _port = value;
                OnPropertyChanged(nameof(Port));
            }
        }



    }
}
